<?php

//对象借口

/**
 * 某个类实现了某个接口和继承了某个接口的区别
 * 1.实现接口跟继承类很类似，但是接口不能直接创建自己的对象
 * 2.继承的父类必须有该方法的具体实现，子类可以重写父类的方法，也可以不重写
 * 3.接口里面的方法是不需要具体实现的，只要定义了方法的名称和参数就可以了，具体的实现必须在实现类中定义
 *
 *
 * 类的方法必须有实现，接口的方法必须为空
 */




//interface关键字用于定义接口
interface ICanEat{
	//接口里面的方法不需要有方法的实现
	public function eat($food);
}
//implements 关键字用于表示类实现某个接口
class Human implements ICanEat{
	//实现某个借口之后，必须提供接口中定义的方法的具体实现
	public function eat($foot){
		echo 'Human eating'.$foot.'<br/>';
	}
}

class Animal implements ICanEat{
	//实现某个借口之后，必须提供接口中定义的方法的具体实现
	public function eat($foot){
		echo 'Animal eating'.$foot.'<br/>';
	}
}
$obj = new Human();

$obj->eat('Apple');

$monkey = new Animal();
$monkey->eat('Banana');


//不能实例化接口
//$eatObj = new ICanEat();

//可以用instanceof关键字来判断某个对象是否实现了某个接口
var_dump($obj instanceof ICanEat);

function checkEat($obj){
	if($obj instanceof ICanEat){
		$obj->eat('food');
	}else{
		echo 'the obj can\'t eat.<br/>';
	}
}

//相同的一行代码，对于传入不同的接口的实现的对象的时候，表现是不同的，这就是多态。
// checkEat($obj);
// checkEat($monkey);



//可以用extends让接口继承接口
interface ICanPee extends ICanEat{
	public function pee();
}
//当类实现子接口时，父接口定义的方法也需要在这个类里面具体实现
class Human1 implements ICanPee{
	public function pee(){}
	public function eat($food){}
}
?>